home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CUCD / Programming / OUI / imgbut.cc < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-08  |  5.2 KB  |  191 lines

  1. // $Id: imgbut.cc 1.4 1998/04/08 15:10:37 dlorre Exp $
  2. #include <intuition/classes.h>
  3. #include <graphics/gfxmacros.h>
  4. #include <intuition/classes.h>
  5. #include <intuition/classusr.h>
  6. #include <intuition/gadgetclass.h>
  7. #include <intuition/imageclass.h>
  8. #include <intuition/cghooks.h>
  9. #include <intuition/icclass.h>
  10. #include <utility/tagitem.h>
  11. #include <utility/hooks.h>
  12. #include <libraries/gadtools.h>
  13.  
  14. #include "screen.h"
  15. #include "window.h"
  16. #include "gadgets/imgbut.h"
  17. #include "gadgets/eclass.h"
  18. #include "gadgetlist.h"
  19. #include "renderim.h"
  20.  
  21. #include <proto/intuition.h>
  22. #include <proto/utility.h>
  23. #include <clib/alib_protos.h>
  24. #include <mydebug.h>
  25. #include <compiler.h>
  26.  
  27. // imgbut est désormais héritée de FButton
  28.  
  29. IMPORT int InitFButton(void) ;
  30. IMPORT void FreeFButton(void) ;
  31. IMPORT Class *BOOPSIfbutton ;
  32.  
  33. static int InitRenderIm(void) ;
  34. static void FreeRenderIm(void) ;
  35. Class *renderim ;
  36.  
  37. extern "C" ULONG STDARGS HookEntry() ;
  38.  
  39. // ========================================================================
  40. // ============================  IMGBUT CLASS =============================
  41. // ========================================================================
  42.  
  43.  
  44. imgbut::imgbut(gadgetlist *gl,
  45.                void (window::*func)(gadget *, unsigned long, unsigned short),
  46.                Image *image,
  47.                Image *box) : gadget(gl, func)
  48. {
  49.     InitFButton() ;
  50.  
  51.     gad = gl->gad = (Gadget *)NewObject(BOOPSIfbutton, NULL,
  52.             GA_ID,          gl->ng->ng_GadgetID,
  53.             GA_Left,        gl->ng->ng_LeftEdge,
  54.             GA_Top,         gl->ng->ng_TopEdge,
  55.             GA_Width,       gl->ng->ng_Width,
  56.             GA_Height,      gl->ng->ng_Height,
  57.             GA_RelVerify,   TRUE,
  58.             GA_Previous,    gl->gad,
  59.             GA_Image,       box,
  60.             GA_LabelImage,  image,
  61.             EGA_XPens,      gl->win->ws->xpens,
  62.             TAG_END) ;
  63.  
  64. }
  65.  
  66. imgbut::~imgbut()
  67. {
  68.     DisposeObject(gad) ;
  69.     FreeFButton() ;
  70. }
  71.  
  72. void imgbut::select(BOOL sel)
  73. {
  74.     SetGadgetAttrs(gad, w, NULL,
  75.         GA_Selected,    sel,
  76.         TAG_END) ;
  77.     RefreshGList(gad, w, NULL, 1);
  78. }
  79.  
  80.  
  81. void imgbut::set(Image* image)
  82. {
  83.     SetGadgetAttrs(gad, w, NULL,
  84.         GA_LabelImage,    image,
  85.         TAG_END) ;
  86. }
  87.  
  88. // ========================================================================
  89. // ========================== RENDER IMAGE ================================
  90. // ========================================================================
  91.  
  92. struct RenderImageData {
  93.     Image *ri_TStyle[9] ;
  94.     Image ri_DefaultImage ;
  95. };
  96.  
  97. static ULONG STDARGS DispatchRenderImage(Class *cl, Object *o, Msg msg);
  98.  
  99. static int ImCnt = 0 ;
  100.  
  101. extern "C" {
  102. int _STI_4000_InitRenderIm(void)
  103. {
  104. int retval = 0 ;
  105.  
  106.     if (!(renderim = MakeClass(NULL, (UBYTE *)"imageclass", NULL,
  107.         sizeof(RenderImageData), 0))) {
  108.         retval = 1 ;
  109.     }
  110.     else {
  111.         renderim->cl_Dispatcher.h_Entry = (HOOKFUNC)HookEntry ;
  112.         renderim->cl_Dispatcher.h_SubEntry = (HOOKFUNC)DispatchRenderImage;
  113.         renderim->cl_Dispatcher.h_Data = NULL ;
  114.     }
  115. #if defined( __GNUG__ )
  116.     if (retval) exit(20) ;
  117. #else
  118.     return retval ;
  119. #endif
  120. }
  121.  
  122. void _STD_4000_FreeRenderIm(void)
  123. {
  124.     FreeClass(renderim) ;
  125. }
  126. }
  127.  
  128. ULONG SAVEDS STDARGS DispatchRenderImage(Class *cl, Object *o, Msg msg)
  129. {
  130. RenderImageData *ird;
  131. impDraw *imd;
  132. APTR    retval = NULL;
  133. unsigned long i ;
  134.  
  135.     GETA4 ;
  136.     switch (msg->MethodID) {
  137.     case OM_NEW:
  138.         if (retval = (APTR)DoSuperMethodA(cl, o, msg)) {
  139.             ird = (RenderImageData *)INST_DATA(cl, retval);
  140.  
  141.             ird->ri_DefaultImage.LeftEdge = (short)GetTagData(IA_Left, 0,
  142.                 ((opSet *)msg)->ops_AttrList);
  143.             ird->ri_DefaultImage.TopEdge = (short)GetTagData(IA_Top, 0,
  144.                 ((opSet *)msg)->ops_AttrList);
  145.             ird->ri_DefaultImage.Width = (short)GetTagData(IA_Width, 0,
  146.                 ((opSet *)msg)->ops_AttrList);
  147.             ird->ri_DefaultImage.Height = (short)GetTagData(IA_Height, 0,
  148.                 ((opSet *)msg)->ops_AttrList);
  149.  
  150.             ird->ri_DefaultImage.Depth = 1 ;
  151.             ird->ri_DefaultImage.ImageData = NULL ;
  152.             ird->ri_DefaultImage.PlanePick = 7 ;
  153.             ird->ri_DefaultImage.PlaneOnOff = 0 ;
  154.             ird->ri_DefaultImage.NextImage = NULL ;
  155.  
  156.             for (i=IRD_Normal; i<= IRD_SelectedDisabled; i++)
  157.                 ird->ri_TStyle[i-IRD_Normal] = (Image *)GetTagData(i,
  158.                     (ULONG)&ird->ri_DefaultImage,
  159.                     ((opSet *)msg)->ops_AttrList);
  160.         }
  161.         break;
  162.     case IM_DRAW:
  163.         ird = (RenderImageData *)INST_DATA(cl, o);
  164.         imd = (impDraw *)msg;
  165.         if (imd->imp_State >= IDS_NORMAL &&
  166.             imd->imp_State <= IDS_SELECTEDDISABLED) {
  167.             DrawImage(imd->imp_RPort,
  168.                     ird->ri_TStyle[imd->imp_State],
  169.                     imd->imp_Offset.X, imd->imp_Offset.Y);
  170.         }
  171.         else
  172.             retval = (APTR)DoSuperMethodA(cl, o, msg);
  173.         break;
  174.     case IM_HITTEST:
  175.         retval = (APTR)DoSuperMethodA(cl, o, msg);
  176.         break;
  177.     case IM_ERASE:
  178.         retval = (APTR)DoSuperMethodA(cl, o, msg);
  179.         break;
  180.     default:
  181.          retval = (APTR)DoSuperMethodA(cl, o, msg);
  182.     }
  183.     return (ULONG)retval;
  184. }
  185.  
  186.  
  187. #if defined( __GNUG__ )
  188. ADD2INIT(_STI_4000_InitRenderIm, -45);
  189. ADD2EXIT(_STD_4000_FreeRenderIm, -45);
  190. #endif
  191.